]> dgit.raspbian.org Git - gnome-shell.git/commitdiff
dbusServices: Port to ESM
authorFlorian Müllner <fmuellner@gnome.org>
Thu, 25 May 2023 18:31:22 +0000 (20:31 +0200)
committerFlorian Müllner <fmuellner@gnome.org>
Wed, 21 Jun 2023 11:26:42 +0000 (13:26 +0200)
We want to replace gjs' custom (and now legacy) imports system
with standard EcmaScript modules: JS developers are already
familiar with them, they have better tooling support and using
standard features over non-standard ones is generally the right
thing to do.

Our D-Bus services are separate from the main process, and thus
can be ported separately (except for the few imports that are
shared with the main process' code base).

Part-of: <https://gitlab.gnome.org/GNOME/gnome-shell/-/merge_requests/2786>

13 files changed:
.eslintrc.yml
js/dbusServices/dbus-service.in
js/dbusServices/dbus-service.service.in
js/dbusServices/dbusService.js
js/dbusServices/extensions/extensionPrefsDialog.js
js/dbusServices/extensions/extensionsService.js
js/dbusServices/extensions/main.js
js/dbusServices/notifications/main.js
js/dbusServices/notifications/notificationDaemon.js
js/dbusServices/screencast/main.js
js/dbusServices/screencast/screencastService.js
js/dbusServices/screensaver/main.js
js/dbusServices/screensaver/screenSaverService.js

index 018e857f79fb2b2186e2eb520af87f48ad2a337e..f1edc4dcfd0fc4dede15feb971da38aeb1e9f2d9 100644 (file)
@@ -4,5 +4,6 @@ extends:
 overrides:
   - files:
       - js/ui/init.js
+      - js/dbusServices/**
     parserOptions:
-      sourceType: module
\ No newline at end of file
+      sourceType: module
index 524166102d6b2120e73fa63427552157d7f99846..5c698f58a7adf23695bdb32ab8ead37533709ace 100644 (file)
@@ -1,5 +1,9 @@
-imports.package.start({
+import {programInvocationName, programArgs} from 'system';
+
+imports.package.init({
     name: '@PACKAGE_NAME@',
     prefix: '@prefix@',
     libdir: '@libdir@',
 });
+const {main} = await import(`${imports.package.moduledir}/main.js`);
+await main([programInvocationName, ...programArgs]);
index 3b0d09abec813c196aa03ef0806d1ae48a3b86ed..c55bd3ce003c79b490e15d5580b5ce53af324c2a 100644 (file)
@@ -1,3 +1,3 @@
 [D-BUS Service]
 Name=@service@
-Exec=@gjs@ @pkgdatadir@/@service@
+Exec=@gjs@ -m @pkgdatadir@/@service@
index 8b6a0a119c10a9ea514afa2eaf419942018838d2..392a4c4c49c1bf5eae2c79f2726e4b48383ea875 100644 (file)
@@ -1,14 +1,13 @@
-/* exported DBusService, ServiceImplementation */
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
 
-const { Gio, GLib } = imports.gi;
+import {programArgs} from 'system';
 
 const Signals = imports.signals;
 
 const IDLE_SHUTDOWN_TIME = 2; // s
 
-const { programArgs } = imports.system;
-
-var ServiceImplementation = class {
+export class ServiceImplementation {
     constructor(info, objectPath) {
         this._objectPath = objectPath;
         this._dbusImpl = Gio.DBusExportedObject.wrapJSObject(info, this);
@@ -150,10 +149,10 @@ var ServiceImplementation = class {
             that._queueShutdownCheck();
         };
     }
-};
+}
 Signals.addSignalMethods(ServiceImplementation.prototype);
 
-var DBusService = class {
+export class DBusService {
     constructor(name, service) {
         this._name = name;
         this._service = service;
@@ -162,7 +161,7 @@ var DBusService = class {
         this._service.connect('shutdown', () => this._loop.quit());
     }
 
-    run() {
+    async runAsync() {
         // Bail out when not running under gnome-shell
         Gio.DBus.watch_name(Gio.BusType.SESSION,
             'org.gnome.Shell',
@@ -183,6 +182,6 @@ var DBusService = class {
             null,
             () => this._loop.quit());
 
-        this._loop.run();
+        await this._loop.runAsync();
     }
-};
+}
index 7155c1a9539a76288ce0f36b0e9f5739c00fbfea..a16476e78b6bef47d0e8d88e1f1a95d40a93ce37 100644 (file)
@@ -1,11 +1,15 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
-/* exported ExtensionPrefsDialog */
 
-const { Adw, Gdk, Gio, GLib, GObject, Gtk } = imports.gi;
+import Adw from 'gi://Adw?version=1';
+import Gdk from 'gi://Gdk?version=4.0';
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
+import GObject from 'gi://GObject';
+import Gtk from 'gi://Gtk?version=4.0';
 
 const ExtensionUtils = imports.misc.extensionUtils;
 
-var ExtensionPrefsDialog = GObject.registerClass({
+export const ExtensionPrefsDialog = GObject.registerClass({
     GTypeName: 'ExtensionPrefsDialog',
 }, class ExtensionPrefsDialog extends Adw.PreferencesWindow {
     _init(extension) {
index d8234d2acb6779189d9abff49725f0858cd7ddba..ab31a6485b5b96c8f8dadb30d00882322413ef19 100644 (file)
@@ -1,18 +1,18 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
-/* exported ExtensionsService */
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
+import Shew from 'gi://Shew';
 
-const { Gio, GLib, Shew } = imports.gi;
+import {ExtensionPrefsDialog} from './extensionPrefsDialog.js';
+import {ServiceImplementation} from './dbusService.js';
 
 const ExtensionUtils = imports.misc.extensionUtils;
-
-const { loadInterfaceXML } = imports.misc.dbusUtils;
-const { ExtensionPrefsDialog } = imports.extensionPrefsDialog;
-const { ServiceImplementation } = imports.dbusService;
+const {loadInterfaceXML} = imports.misc.dbusUtils;
 
 const ExtensionsIface = loadInterfaceXML('org.gnome.Shell.Extensions');
 const ExtensionsProxy = Gio.DBusProxy.makeProxyWrapper(ExtensionsIface);
 
-var ExtensionsService = class extends ServiceImplementation {
+export const ExtensionsService = class extends ServiceImplementation {
     constructor() {
         super(ExtensionsIface, '/org/gnome/Shell/Extensions');
 
index 306fe36f5ec8ee0eaedc3c6c235ea7ca7497adf1..c281a8a16cdcd36f62031539ec45218a07799b60 100644 (file)
@@ -1,16 +1,12 @@
-/* exported main */
-
-imports.gi.versions.Adw = '1';
-imports.gi.versions.Gdk = '4.0';
-imports.gi.versions.Gtk = '4.0';
-
-const { Adw, GObject } = imports.gi;
+import Adw from 'gi://Adw?version=1';
+import GObject from 'gi://GObject';
 const pkg = imports.package;
 
-const { DBusService } = imports.dbusService;
-const { ExtensionsService } = imports.extensionsService;
+import {DBusService} from './dbusService.js';
+import {ExtensionsService} from './extensionsService.js';
 
-function main() {
+/** @returns {void} */
+export async function main() {
     Adw.init();
     pkg.initFormat();
 
@@ -19,5 +15,5 @@ function main() {
     const service = new DBusService(
         'org.gnome.Shell.Extensions',
         new ExtensionsService());
-    service.run();
+    await service.runAsync();
 }
index 7944cd122a0955741ad21ae276edac9273445b5b..14c3f4a871afc38b4c6992e967c3eb02f3b1c483 100644 (file)
@@ -1,11 +1,10 @@
-/* exported main */
+import {DBusService} from './dbusService.js';
+import {NotificationDaemon} from './notificationDaemon.js';
 
-const { DBusService } = imports.dbusService;
-const { NotificationDaemon } = imports.notificationDaemon;
-
-function main() {
+/** @returns {void} */
+export async function main() {
     const service = new DBusService(
         'org.gnome.Shell.Notifications',
         new NotificationDaemon());
-    service.run();
+    await service.runAsync();
 }
index b22f4ec1e44ff55c2023e027e051fbd9dc34227f..7bb5b7bf0237d83dc08eb2e43697ca7da8f43b18 100644 (file)
@@ -1,17 +1,17 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
-/* exported NotificationDaemon */
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
 
-const { Gio, GLib } = imports.gi;
+import {ServiceImplementation} from './dbusService.js';
 
-const { loadInterfaceXML } = imports.misc.dbusUtils;
-const { ServiceImplementation } = imports.dbusService;
+const {loadInterfaceXML} = imports.misc.dbusUtils;
 
 const NotificationsIface = loadInterfaceXML('org.freedesktop.Notifications');
 const NotificationsProxy = Gio.DBusProxy.makeProxyWrapper(NotificationsIface);
 
 Gio._promisify(Gio.DBusConnection.prototype, 'call');
 
-var NotificationDaemon = class extends ServiceImplementation {
+export const NotificationDaemon = class extends ServiceImplementation {
     constructor() {
         super(NotificationsIface, '/org/freedesktop/Notifications');
 
index 7c71971fb85b19f281b3cb986a383d7231c2cb62..26a6224d9ef073a6013a60f7865f90a6af1455e0 100644 (file)
@@ -1,14 +1,13 @@
-/* exported main */
+import {DBusService} from './dbusService.js';
+import {ScreencastService} from './screencastService.js';
 
-const {DBusService} = imports.dbusService;
-
-function main() {
-    const {ScreencastService} = imports.screencastService;
+/** @returns {void} */
+export async function main() {
     if (!ScreencastService.canScreencast())
         return;
 
     const service = new DBusService(
         'org.gnome.Shell.Screencast',
         new ScreencastService());
-    service.run();
+    await service.runAsync();
 }
index eda5c8293b3727eb617b32f3f7586a0aa9fc14f1..745102376419d92da7758d9bf0e877a4c6ab9735 100644 (file)
@@ -1,14 +1,13 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
-/* exported ScreencastService */
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
+import Gst from 'gi://Gst?version=1.0';
+import Gtk from 'gi://Gtk?version=4.0';
 
-imports.gi.versions.Gst = '1.0';
-imports.gi.versions.Gtk = '4.0';
+import {ServiceImplementation} from './dbusService.js';
 
-const { Gio, GLib, Gst, Gtk } = imports.gi;
-
-const { loadInterfaceXML, loadSubInterfaceXML } = imports.misc.dbusUtils;
+const {loadInterfaceXML, loadSubInterfaceXML} = imports.misc.dbusUtils;
 const Signals = imports.misc.signals;
-const { ServiceImplementation } = imports.dbusService;
 
 const ScreencastIface = loadInterfaceXML('org.gnome.Shell.Screencast');
 
@@ -400,7 +399,7 @@ var Recorder = class extends Signals.EventEmitter {
     }
 };
 
-var ScreencastService = class extends ServiceImplementation {
+export const ScreencastService = class extends ServiceImplementation {
     static canScreencast() {
         if (!Gst.init_check(null))
             return false;
index 2a08d14038d1df600624ff0377cb18712ee6c29e..7242c7982f42cf0a4c62dd647b5f6e7e9fa2183d 100644 (file)
@@ -1,11 +1,10 @@
-/* exported main */
+import {DBusService} from './dbusService.js';
+import {ScreenSaverService} from './screenSaverService.js';
 
-const { DBusService } = imports.dbusService;
-const { ScreenSaverService } = imports.screenSaverService;
-
-function main() {
+/** @returns {void} */
+export async function main() {
     const service = new DBusService(
         'org.gnome.ScreenSaver',
         new ScreenSaverService());
-    service.run();
+    await service.runAsync();
 }
index 2c1546e4263c5bd117d808f2073b0d4355a238c1..d0f0db6e38a2c3e8af5b89579d4eb24df937cb99 100644 (file)
@@ -1,15 +1,15 @@
 // -*- mode: js; js-indent-level: 4; indent-tabs-mode: nil -*-
-/* exported ScreenSaverService */
+import Gio from 'gi://Gio';
+import GLib from 'gi://GLib';
 
-const { Gio, GLib } = imports.gi;
+import {ServiceImplementation} from './dbusService.js';
 
-const { loadInterfaceXML } = imports.misc.dbusUtils;
-const { ServiceImplementation } = imports.dbusService;
+const {loadInterfaceXML} = imports.misc.dbusUtils;
 
 const ScreenSaverIface = loadInterfaceXML('org.gnome.ScreenSaver');
 const ScreenSaverProxy = Gio.DBusProxy.makeProxyWrapper(ScreenSaverIface);
 
-var ScreenSaverService = class extends ServiceImplementation {
+export const ScreenSaverService = class extends ServiceImplementation {
     constructor() {
         super(ScreenSaverIface, '/org/gnome/ScreenSaver');